# coding: utf-8
import sys,os,inspect
import numpy as np
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
parentdir = os.path.dirname(currentdir)
sys.path.insert(0,parentdir) 
from common.functions import softmax, cross_entropy_error
from common.gradient import numerical_gradient


class simpleNet:
    def __init__(self):
        self.W = np.random.randn(2,3)#随机初始化权重

    def predict(self, x):
    #这里的W是2行3列的权重矩阵,所以对应着的网络是:
    # 两个输入节点,中间的一层是三个节点,
    # 这样排列组合就是6各条权重线
        return np.dot(x, self.W)

    def loss(self, x, t):
        z = self.predict(x)
        y = softmax(z)
        loss = cross_entropy_error(y, t)
        return loss

# ------------------------------------------
x = np.array([0.6, 0.9])#这个是裸数据,不带类别
t = np.array([0, 0, 1])#这个是神经网络中间一层的预期输入数值,还没有经过隐藏单元中的激活函数处理.

net = simpleNet()#new 一个对象

f = lambda w: net.loss(x, t)
#定义一个函数,这里调用了类中的成员函数,这个函数是根据输入的裸数据和类别标签来计算loss

dW = numerical_gradient(f, net.W)
#这个总体是一个求导函数,这里的net.W代入f的效果,是在numerical_gradient的定义中实现的.

print(dW)#输出六根权重线的数值
